package com.woniuxy.flowable.task;

import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.JavaDelegate;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

/**
 * HTTP 回调服务任务
 * 通用的回调处理器，可以在 BPMN 流程中配置使用
 * 
 * 使用方式：
 * 在 BPMN 的服务任务中配置：
 * - Class: com.woniuxy.flowable.task.HttpCallbackServiceTask
 * - 流程变量:
 *   - callbackUrl: 回调地址
 *   - callbackAction: 回调动作（approve-success, approve-reject等）
 *   - 其他业务参数
 */
@Slf4j
@Component("httpCallbackServiceTask")
public class HttpCallbackServiceTask implements JavaDelegate {
    
    @Override
    public void execute(DelegateExecution execution) {
        log.info("开始执行 HTTP 回调任务");
        
        try {
            // 获取回调配置
            String callbackUrl = (String) execution.getVariable("callbackUrl");
            String callbackAction = (String) execution.getVariable("callbackAction");
            
            if (callbackUrl == null || callbackUrl.isEmpty()) {
                log.warn("未配置回调URL，跳过回调");
                return;
            }
            
            // 构建完整的回调地址
            String fullUrl = callbackUrl;
            if (callbackAction != null && !callbackAction.isEmpty()) {
                fullUrl = callbackUrl + "/" + callbackAction;
            }
            
            // 收集所有流程变量作为回调参数
            Map<String, Object> variables = execution.getVariables();
            Map<String, Object> callbackParams = new HashMap<>(variables);
            
            // 移除一些内部变量
            callbackParams.remove("callbackUrl");
            callbackParams.remove("callbackAction");
            
            log.info("执行 HTTP 回调，URL: {}, 参数: {}", fullUrl, JSONUtil.toJsonStr(callbackParams));
            
            // 发送 HTTP POST 请求
            String response = HttpUtil.post(fullUrl, JSONUtil.toJsonStr(callbackParams));
            
            log.info("HTTP 回调成功，响应: {}", response);
            
            // 将响应结果保存到流程变量
            execution.setVariable("callbackResponse", response);
            
        } catch (Exception e) {
            log.error("HTTP 回调失败", e);
            // 根据需要决定是否抛出异常
            // throw new RuntimeException("回调失败: " + e.getMessage());
        }
    }
}




